﻿// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;
using System.Windows;
using System.Windows.Media;

using ICSharpCode.AvalonEdit.Rendering;

namespace ICSharpCode.AvalonEdit.Rendering
{
    sealed class CurrentLineHighlightRenderer : IBackgroundRenderer
    {
        #region Fields

        int line;
        TextView textView;

        public static readonly Color DefaultBackground = Color.FromArgb(22, 220, 220, 224);
        public static readonly Color DefaultBorder = Color.FromArgb(255, 240, 106, 0);
        //Color.FromArgb(255, 30, 60, 180);//Color.FromArgb(52, 0, 255, 110);
        //高亮显示当前文本行是显示的两条横线的色彩（本质上是个矩形）。

        #endregion

        #region Properties

        public int Line
        {
            get { return this.line; }
            set
            {
                if (this.line != value)
                {
                    this.line = value;
                    this.textView.InvalidateLayer(this.Layer);
                }
            }
        }

        public KnownLayer Layer
        {
            get { return KnownLayer.Selection; }
        }

        public Brush BackgroundBrush
        {
            get; set;
        }

        public Pen BorderPen
        {
            get; set;
        }

        #endregion

        public CurrentLineHighlightRenderer(TextView textView)
        {
            if (textView == null)
                throw new ArgumentNullException("textView");

            this.BorderPen = new Pen(new SolidColorBrush(DefaultBorder), 1)
            {
                DashStyle = DashStyles.Solid,   //本来是 Dash，考虑到有些人有密集恐惧症，于是改回实线好了。
            };
            this.BorderPen.Freeze();

            this.BackgroundBrush = new SolidColorBrush(DefaultBackground);
            this.BackgroundBrush.Freeze();

            this.textView = textView;
            this.textView.BackgroundRenderers.Add(this);

            this.line = 0;
        }

        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (!this.textView.Options.HighlightCurrentLine)
                return;

            BackgroundGeometryBuilder builder = new BackgroundGeometryBuilder();

            var visualLine = this.textView.GetVisualLine(line);
            if (visualLine == null) return;

            var linePosY = visualLine.VisualTop - this.textView.ScrollOffset.Y;

            builder.AddRectangle(textView, new Rect(0, linePosY, textView.ActualWidth + 1, visualLine.Height));
            //加1之后，右边线就出不来了，要的就是这效果。

            Geometry geometry = builder.CreateGeometry();
            if (geometry != null)
            {
                drawingContext.DrawGeometry(this.BackgroundBrush, this.BorderPen, geometry);
            }
        }
    }
}
